package com.cb2.algorithm.leetcode;

import java.util.HashSet;
import java.util.Set;

/**
 * <a href="https://leetcode.cn/problems/happy-number">快乐数(Happy Number)</a>
 * <p>编写一个算法来判断一个数 n 是不是快乐数。</p>
 * <p>「快乐数」 定义为：
 * <ul>
 *     <li>对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。</li>
 *     <li>然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。</li>
 *     <li>如果这个过程 结果为 1，那么这个数就是快乐数。</li>
 * </ul>
 * </p>
 * <p>如果 n 是 快乐数 就返回 true ；不是，则返回 false 。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 *  示例 1：
 *      输入：n = 19
 *      输出：true
 *      解释：
 *          1^2 + 9^2 = 82
 *          8^2 + 2^2 = 68
 *          6^2 + 8^2 = 100
 *          1^2 + 0^2 + 0^2 = 1
 *
 *  示例 2：
 *      输入：n = 2
 *      输出：false
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>1 <= n <= 2^31 - 1</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2025/2/7 11:51
 */
public class LC0202HappyNumber_S {
    static class Solution {
        public boolean isHappy(int n) {
            // 记录已经出现过的数字，避免出现循环
            Set<Integer> visited = new HashSet<>();
            while (n != 1 && !visited.contains(n)) {
                visited.add(n);
                int sum = 0;
                while (n > 0) {
                    int i = n % 10;
                    sum += i * i;
                    n /= 10;
                }
                n = sum;
            }
            return n == 1;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.isHappy(19));
        System.out.println(solution.isHappy(2));
    }
}
